上一篇概述了 Semantic Kernel 的核心組成,本篇將更深入探討 Kernel 的使用,並透過一個入門範例來展示如何進行設定與操作。本範例著重於展示一個簡單的對話回合,幫助大家理解如何開始使用 Semantic Kernel 以及基本的 Kernel 配置。因此,此處不會涉及長短期記憶、Plugins、Agents等進階主題,這些內容將在後續章節中逐步介紹。
dotnet add package Microsoft.SemanticKernel --version 1.19.0
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: openai_modelId,
apiKey: openai_apiKey)
.Build();
Kernel kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(
endpoint: aoai_endpoint,
deploymentName: aoai_deployment,
apiKey: aoai_apiKey)
.Build();
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的動物是什麼?"));
輸出的結果:
世界上最大的動物是藍鯨(Balaenoptera musculus)。藍鯨可以長達30米(約98英尺)或更長,體重可達200噸以上,甚至有些記錄顯示可以達到300噸。藍鯨是一種生活在海洋中的浮游生物食性動物,主要以磷蝦為食。藍鯨是地球上現存最大的動物,也是史上最大的動物之一。
接著讓我們再延伸一下範例,將 prompt 設計成簡單樣版格式,可以透過變數可以置換特定內容。例如:我們把"動物"變成一個可替換變數,可以讓上面應用層面更廣。
KernelArguments arguments = new() { { "topic", "植物" } };
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的{{$topic}}是什麼?", arguments));
輸出的結果:
世界上最大的植物通常被認為是波多黎各的「海藻森林」(Posidonia oceanica),但如果考慮到單一個體的面積,則是美國俄勒岡州的「蜜蜂樹」(Pando),這是一個白楊樹(Populus tremuloides)的克隆群,估計有超過80,000棵樹,佔地約106公頃。
如果從高度來看,則加州的「紅杉樹」(Sequoiadendron giganteum)是已知的最高樹木之一,能達到超過100米。
因此,根據不同的標準,不同的植物可能會被視為「最大的植物」。
KernelArguments arguments = new() { { "topic", "植物" }, { "lang", "英文" } };
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的{{$topic}}是什麼? 請用{{$lang}}回答", arguments));
Console.WriteLine();
我們都知道LLMs模型在生成回應需要一點時間,這個時間的長短會隨著使用者的提問複雜程度而增加,因此為了提升使用者體驗,Semantic Kernel 也支援 OpenAI 的 stream 回應方式。將原本的InvokePromptAsync改成呼叫 InvokePromptStreamingAsync,搭配迴圈進行回應的文字顯示。
— 使用 InvokePromptStreamingAsync
KernelArguments arguments = new() { { "topic", "植物" } };
await foreach (var result in kernel.InvokePromptStreamingAsync("世界最大的{{$topic}}是什麼?", arguments))
{
Console.Write(result);
}
Console.WriteLine();
以 OpenAI 的 GPT 模型為例,提供了部分可自訂的參數來進行配置,其中最常見的就是 temperature。temperature 的數值越高,模型的輸出就越具創意或「瘋狂」,反之,數值越低,模型則會更保守和「冷靜」。因此,Semantic Kernel 也提供了相應的機制來調整這些參數值。
不同的模型服務商所使用的設定檔和參數值會有所不同,以 OpenAI 為例,Semantic Kernel 提供了 OpenAIPromptExecutionSettings 物件,可以用來配置 OpenAI GPT 模型的參數。舉例來說,如果想要將最大 Tokens 設定為 200,temperature 設定為 0.3,便可以像以下這樣進行設定:
KernelArguments arguments = new(new OpenAIPromptExecutionSettings { MaxTokens = 200, Temperature = 0.3 }) { { "topic", "植物" } };
await foreach (var result in kernel.InvokePromptStreamingAsync("世界最大的{{$topic}}是什麼?", arguments))
{
Console.Write(result);
}
Console.WriteLine();
如此一來就可以靈活的調整模型的輸出行為,根據不同需求場景進行微調。
本篇內容利用簡單的範例,帶大家理解 Kernel 的用法與基本使用,如果你的使用情境相對單純,事實上只需要Kernel便可以快速整合到現有的應用,例如:摘要的應用,不涉及多回合的對話,只要使用KernelArguments 配合 Prompt,就能輕鬆做到。上一篇有提到 Semantic Kernel 也支援地端模型的連接,這部份我會在後續文章中做說明。